package com.zb.netty.c4;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

/**
 * @author: zhaobin
 * @date: 2024/6/24 16:24
 * @Description:
 */
public class ByteBufLearn {

    public static void main(String[] args) {
        // 创建byteBuf（直接内存，而不是堆内存），默认大小是256，通过该方式创建的ByteBuf对象会自动扩容，与nio的ByteBuffer不一样，nio达到融期限之后，会报错
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(32);
        // 使用ByteBufAllocator创建直接内容，直接内容不需要考虑GC回收，默认获取的 byteBuf 便是直接内存，需要主动释放关闭
        // ByteBuf directBuffer = ByteBufAllocator.DEFAULT.directBuffer();
        // 使用ByteBufAllocator创建堆内存
        // ByteBuf heapBuffer = ByteBufAllocator.DEFAULT.heapBuffer();

        ByteBuffer byteBuffer = ByteBuffer.allocate(32);

        // 往byteBuf里面写入内容
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 32; i++) {
            stringBuilder.append(i).append("-");
        }

        // 往ByteBuf对象中写入数据，当达到容量界限之后，会自动扩容
        byteBuf.writeBytes(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
        ByteBufUtil.log(byteBuf);

        // 往nio的byteBuffer对象中写入数据，达到界限之后，会抛出 BufferOverflowException 的异常
        byteBuffer.put(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));

    }
}
